#ifndef CARD_H
#define CARD_H

#include <string>

using namespace std;

enum cardColor { NOCOLOR, WHITE, YELLOW, RED, PURPLE };
enum cardCategory { NOCATEGORY, ACTION, STATUS_EFFECT, ACTION_STATUS };

class card {
	public:
		// constructors
		card ();	// empty constructor
		void clear ();	// clear the contents of the card
	
		// basic information
		string name;
		cardColor color;
		cardCategory category;
		string description;	// full card text other than name, including effects
		
		// data only for Action cards
		int changeInTargetHP, changeInUserHP;	// use 1000 for max HP and -1000 for full drain
		int changeInTargetMP, changeInUserMP;	// use 1000 for max MP and -1000 for full drain
		bool isElemental, isMultiElemental;		// whether the card's effects are elemental and whether more than one
		bool isMelee, isRanged, isNonElemental;	// non-elementals
		bool isDark, isLight, isIce, isFire, isWind, isWater, isEarth, isLightning;	// elementals
		bool removeTargetPositiveEffects, removeTargetNegativeEffects;	// whether to remove positive/negative effects from the target
		bool removeUserPositiveEffects, removeUserNegativeEffects;	// whether to remove positive/negative effects from the user
		bool affectsAllOtherPlayers;	// whether the card affects all other players or only the target
		bool discardTargetEntireHand, discardUserEntireHand;	// whether or not to discard hands
		bool shuffleUserDeck, shuffleTargetDeck;	// whether the user or target must shuffle
		bool blockAllOtherCards;	// whether or not to discard (and disregard) all other cards played this round
		bool redirectTargets;	// whether or not the user can choose new targets for all cards this turn
		
		// data only for Status Effect cards
		bool positiveEffect, negativeEffect, otherEffect;	// whether the card has positive, negative, or other effects
		int defenseBasic, defenseMelee, defenseRanged, defenseDark, defenseLight, defenseIce,
				defenseFire, defenseWater, defenseEarth, defenseLightning;	// defensive effects
		int attackBasic, attackMelee, attackRanged, attackDark, attackLight, attackIce,
				attackFire,	attackWater, attackEarth, attackLightning;	// attack effects
		int changeInHPPerTurn, changeInMPPerTurn;	// gains or losses in holder's MP or HP per turn
		int retaliatoryDamage;	// the amount of damage	dealt when attacked
		bool cardsFaceUp;	// holder must keep their hand visible to all
		bool holdSixCards;	// whether the holder can have six cards in their hand
		bool nullifyPositiveEffects;	// whether the card nullifies existing positive status effects
		float percentDamageTakenGainedInMP;	// the percentage of damage taken to gain in MP
		bool playTwoCardsPerTurn;	// whether or not the holder can play two cards per turn
		
		// data for shared cards
		int cardsToDiscard;	// target must discard this many cards
		bool causesParalysis;	// whether the card paralyzes the holder
		bool discardToRemove;	// whether the card can be removed by discarding
		bool affectedByStatusEffects;	// whether the card's behavior is affected by existing status effects

		// data for cards using a die roll
		bool requiresDieRoll;	// whether the card behaves differently based on a die roll
		string cardNameForDieRollOne, cardNameForDieRollTwo, cardNameForDieRollThree,
			cardNameForDieRollFour, cardNameForDieRollFive, cardNameForDieRollSix;	// cards for each die result
};

#endif
